package com.caojing.harmonyfrist.slice;

import com.caojing.harmonyfrist.ResourceTable;
import com.caojing.harmonyfrist.view.GameView;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.*;
import ohos.agp.components.DirectionalLayout.LayoutConfig;
import ohos.agp.components.element.ShapeElement;
import ohos.agp.utils.Color;
import ohos.agp.utils.LayoutAlignment;
import ohos.agp.utils.TextAlignment;
import ohos.data.DatabaseHelper;
import ohos.data.preferences.Preferences;

public class MainAbilitySlice extends AbilitySlice {

    // 布局，将myLayoutTop、stackLayout、myLayoutBottom添加到myLayout
    private final DirectionalLayout myLayout = new DirectionalLayout(this);
    private final DirectionalLayout myLayoutTop = new DirectionalLayout(this);
    private final DirectionalLayout myLayoutBottom = new DirectionalLayout(this);
    // stackLayout作为游戏交互视图
    private final StackLayout stackLayout = new StackLayout(this);

    private int score = 0;
    private Text tvScore, tvTotal,textGameOver;


    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 重置游戏视图
        // setUIContent(ResourceTable.Layout_main_layout);

        // 布局属性：宽高匹配父元素、宽高匹配内容
        LayoutConfig configParent = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT);
        LayoutConfig configContent = new LayoutConfig(LayoutConfig.MATCH_CONTENT, LayoutConfig.MATCH_CONTENT);

        // 属性元素：myLayout背景
        ShapeElement element = new ShapeElement();
        element.setRgbColor(new RgbColor(255, 255, 255));
        // 属性元素：圆角矩形
        ShapeElement scoreBg = new ShapeElement();
        scoreBg.setRgbColor(new RgbColor(181, 171, 160));
        scoreBg.setCornerRadius(20f);
        // 属性元素：文字颜色
        ShapeElement textElement=new ShapeElement();
        textElement.setRgbColor(new RgbColor(255,255,255,150));

        // 布局myLayoutTop设置
        // 设置宽高匹配内容
        myLayoutTop.setLayoutConfig(configContent);
        // 设置布局对齐为居中
        myLayoutTop.setAlignment(LayoutAlignment.CENTER);
        // 设置上外边距
        myLayoutTop.setMarginTop(40);
        // 设置水平布局
        myLayoutTop.setOrientation(Component.HORIZONTAL);

        // 布局myLayoutBottom设置
        // 设置宽高匹配内容
        myLayoutBottom.setLayoutConfig(configContent);
        // 设置布局对齐为居中
        myLayoutBottom.setAlignment(LayoutAlignment.CENTER);
        // 设置水平布局
        myLayoutBottom.setOrientation(Component.HORIZONTAL);
        // 设置上下外边距
        myLayoutBottom.setMarginsTopAndBottom(20,10);

        // 布局stackLayout设置
        // 设置宽高匹配内容
        stackLayout.setLayoutConfig(configContent);

        // 页面主体布局myLayout设置
        // 设置页面主体布局对齐为居中
        myLayout.setAlignment(LayoutAlignment.CENTER);
        // 设置页面宽高匹配父元素(本Ability)
        myLayout.setLayoutConfig(configParent);
        // 设置背景
        myLayout.setBackground(element);

        // 按从右向左，从上向下的顺序元素：文字：2048，组件：当前分数，组件：最高分数，文字：提示性文字，组件：悔棋，组件：重新开始

        // 添加描述性文字
        Text gameName=new Text(this);
        // 设置宽高匹配内容
        gameName.setLayoutConfig(configContent);
        // 设置文字
        gameName.setText("2048");
        // 设置文字大小
        gameName.setTextSize(100);
        // 设置右外边距
        gameName.setMarginRight(200);
        // 添加组件到myLayoutTop
        myLayoutTop.addComponent(gameName);

        // 添加当前分数计分板
        DirectionalLayout scoreLayout = new DirectionalLayout(this);
        // 设置宽高匹配内容
        scoreLayout.setLayoutConfig(configContent);
        // 内容居中对齐
        scoreLayout.setAlignment(LayoutAlignment.CENTER);
        // 组件垂直排列
        scoreLayout.setOrientation(Component.VERTICAL);
        // 设置背景
        scoreLayout.setBackground(scoreBg);
        // 设置右外边距
        scoreLayout.setMarginRight(30);
        // 单独设置宽度
        scoreLayout.setWidth(200);
        // 设置上内边距
        scoreLayout.setPaddingTop(5);
        // 设置下内边距
        scoreLayout.setPaddingBottom(5);

        // 描述文字
        Text tvScoreName = new Text(this);
        // 设置宽高匹配内容
        tvScoreName.setLayoutConfig(configContent);
        // 设置文字
        tvScoreName.setText("分数");
        // 设置文字颜色
        tvScoreName.setTextColor(new Color(0xFFFFFFFF));
        // 设置文字大小
        tvScoreName.setTextSize(25);
        // 添加文字组件到当前分数计分板
        scoreLayout.addComponent(tvScoreName);

        // 分数文字
        tvScore = new Text(this);
        // 设置宽高匹配内容
        tvScore.setLayoutConfig(configContent);
        // 设置文字
        tvScore.setText("0");
        // 设置文字颜色
        tvScore.setTextColor(new Color(0xFFFFFFFF));
        // 设置文字大小
        tvScore.setTextSize(40);
        // 添加文字组件到当前分数计分板
        scoreLayout.addComponent(tvScore);
        // 添加计分板到myLayoutTop
        myLayoutTop.addComponent(scoreLayout);

        // 最高分计分板
        DirectionalLayout totalLayout = new DirectionalLayout(this);
        // 设置宽高匹配内容
        totalLayout.setLayoutConfig(configContent);
        // 内容居中对齐
        totalLayout.setAlignment(LayoutAlignment.CENTER);
        // 组件垂直排列
        totalLayout.setOrientation(Component.VERTICAL);
        // 设置组件背景
        totalLayout.setBackground(scoreBg);
        // 单独设置宽度
        totalLayout.setWidth(200);
        // 设置上内边距
        totalLayout.setPaddingTop(5);
        // 设置下内边距
        totalLayout.setPaddingBottom(5);

        // 最高分文字
        Text tvTotalName = new Text(this);
        // 设置宽高匹配内容
        tvTotalName.setLayoutConfig(configContent);
        // 设置文字内容
        tvTotalName.setText("最高分");
        // 设置文字颜色
        tvTotalName.setTextColor(new Color(0xFFFFFFFF));
        // 设置文字大小
        tvTotalName.setTextSize(25);
        // 添加组件到最高分数计分板
        totalLayout.addComponent(tvTotalName);

        // 最高分
        tvTotal = new Text(this);
        // 设置宽高匹配内容
        tvTotal.setLayoutConfig(configContent);
        // 设置初始值为0
        tvTotal.setText("0");
        // 设置文字颜色
        tvTotal.setTextColor(new Color(0xFFFFFFFF));
        // 设置文字大小
        tvTotal.setTextSize(40);
        // 添加组件到totalLayout
        totalLayout.addComponent(tvTotal);
        // 添加计分板到myLayoutTop
        myLayoutTop.addComponent(totalLayout);

        // 游戏主视图，属性继承自TableLayout
        GameView gameView = new GameView(this);
        // 设置宽高匹配内容
        gameView.setLayoutConfig(configContent);
        // 内容居中对齐
        gameView.setAlignmentType(LayoutAlignment.LEFT);
        // 添加游戏视图到stackLayout
        stackLayout.addComponent(gameView);

        // 隐藏元素GameOver文字
        textGameOver=new Text(this);
        // 设置宽高匹配内容
        textGameOver.setLayoutConfig(configContent);
        // 设置文字
        textGameOver.setText("游戏结束");
        // 设置文字大小
        textGameOver.setTextSize(100);
        // 设置文字对齐方式
        textGameOver.setTextAlignment(TextAlignment.CENTER);
        // 设置文字背景
        textGameOver.setBackground(textElement);
        // 添加文字到游戏主视图
        stackLayout.addComponent(textGameOver);
        // 设置为不可见
        textGameOver.setVisibility(Component.INVISIBLE);

        // 提示性文字
        Text textDetails=new Text(this);
        // 文字内容
        textDetails.setText("合并相同方块，得到2048的方块!");
        // 文字大小
        textDetails.setTextSize(30);
        // 设置右外边距
        textDetails.setMarginRight(230);
        // 添加文字到myLayoutBottom
        myLayoutBottom.addComponent(textDetails);

        // 悔棋图片组件
        Image imgRetract = new Image(this);
        // 设置宽高匹配内容
        // imgRetract.setLayoutConfig(configContent);
        // 设置宽高
        imgRetract.setWidth(80);
        imgRetract.setHeight(80);
        // 设置又外边距
        imgRetract.setMarginRight(40);
        // 设置内边距调整图片大小
        imgRetract.setPadding(15,15,15,15);
        // 设置组件图片
        imgRetract.setImageAndDecodeBounds(ResourceTable.Media_jiantou);
        // 设置图片缩放，使图片与组件的大小相同或更小，居中显示
        imgRetract.setScaleMode(Image.ScaleMode.INSIDE);
        // 设置背景
        imgRetract.setBackground(scoreBg);
        // 添加图片到myLayoutBottom
        myLayoutBottom.addComponent(imgRetract);

        // 重新开始图片组件
        Image imgRestart = new Image(this);
        // 设置宽高匹配内容
        // imgRestart.setLayoutConfig(configContent);
        // 设置宽高
        imgRestart.setWidth(80);
        imgRestart.setHeight(80);
        // 设置内边距调整图片大小
        imgRestart.setPadding(15,15,15,15);
        // 设置组件图片
        imgRestart.setImageAndDecodeBounds(ResourceTable.Media_shuaxingengxin);
        // 设置图片缩放，使图片与组件的大小相同或更小，居中显示
        imgRestart.setScaleMode(Image.ScaleMode.INSIDE);
        // 设置背景
        imgRestart.setBackground(scoreBg);
        // 添加图片到myLayoutBottom
        myLayoutBottom.addComponent(imgRestart);

        // 添加布局到主题布局
        myLayout.addComponent(myLayoutTop);
        myLayout.addComponent(myLayoutBottom);
        myLayout.addComponent(stackLayout);

        // 数据库
        DatabaseHelper databaseHelper = new DatabaseHelper(this);
        // fileName表示文件名，其取值不能为空，也不能包含路径，默认存储目录可以通过context.getPreferencesDir()获取
        String fileName = "game";
        // 该实例对数据库进行操作
        Preferences preferences = databaseHelper.getPreferences(fileName);
        // 保存的最高分
        int totalScore = preferences.getInt("totalScore", 0);
        // 设置显示最高分
        tvTotal.setText("" + totalScore);

        // 重新开始游戏点击事件
        imgRestart.setClickedListener(component -> {
            // 重新初始化gameView
            gameView.startGame();
            // this.startGame(); 用于隐藏游戏结束的UI
            startGame();
        });

        // 悔棋点击事件
        imgRetract.setClickedListener(component -> gameView.retractGame());

        // 初始化所有UI组件
        super.setUIContent(myLayout);

    }

    /**
     * 游戏结束，显示结束UI
     */
    public void gameOver(){
        textGameOver.setVisibility(Component.VISIBLE);
    }

    /**
     * 游戏开始，隐藏结束UI
     */
    public void startGame(){
        textGameOver.setVisibility(Component.INVISIBLE);
    }

    /**
     * 清除分数
     */
    public void clearScore() {
        score = 0;
        showScore();
    }

    /**
     * 设置分数
     */
    public void showScore() {
        tvScore.setText("" + score);
    }

    /**
     * 最高分为当前分数，设置最高分
     * @param score 分数
     */
    public void showScore(int score) {
        tvScore.setText("" + score);
    }

    /**
     * 显示最高分
     * @param totalScore 最高分
     */
    public void showTotalScore(int totalScore) {
        tvTotal.setText("" + totalScore);
    }

    /**
     * 增加分数
     * @param score 当前分数
     */
    public void addScore(int score) {
        this.score += score;
        showScore();
    }

    /**
     * 获取分数
     * @return score 当前分数
     */
    public Integer getScore() {
        return score;
    }


    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}
